#include<malloc.h>
#include<stdio.h>
#define OK 1
#define ERROR 0
#define ERROR2 2;
#define ERROR1 -1
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量

typedef char SElemType1; // 定义栈元素类型
typedef int SElemType2; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码，如OK等

struct SqStack1
{
     SElemType1 *base; // 在栈构造之前和销毁之后，base的值为NULL
     SElemType1 *top; // 栈顶指针
     int stacksize; // 当前已分配的存储空间，以元素为单位
}; // 顺序栈

struct SqStack2
{
     SElemType2 *base; // 在栈构造之前和销毁之后，base的值为NULL
     SElemType2 *top; // 栈顶指针
     int stacksize; // 当前已分配的存储空间，以元素为单位
}; // 顺序栈

Status InitStack1(SqStack1 &S)
{
// 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE
	S.base=(SElemType1*)malloc(STACK_INIT_SIZE*sizeof(SElemType1));
     if(!S.base) return ERROR;
	 S.top=S.base;
	 S.stacksize=STACK_INIT_SIZE;
	 return OK;
}

Status InitStack2(SqStack2 &S)
{
// 构造一个空栈S，该栈预定义大小为STACK_INIT_SIZE
	S.base=(SElemType2*)malloc(STACK_INIT_SIZE*sizeof(SElemType2));
     if(!S.base) return ERROR;
	 S.top=S.base;
	 S.stacksize=STACK_INIT_SIZE;
	 return OK;
}

Status Push1(SqStack1 &S,SElemType1 e)
{
// 在栈S中插入元素e为新的栈顶元素
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(SElemType1*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType1));
		if(!S.base) return ERROR;
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return OK;
}

Status Push2(SqStack2 &S,SElemType2 e)
{
// 在栈S中插入元素e为新的栈顶元素
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(SElemType2*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType2));
		if(!S.base) return ERROR;
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return OK;
}

Status Pop1(SqStack1 &S,SElemType1 &e)
{
// 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR
	if(S.top==S.base) return ERROR;
     e=*--S.top;
	 return OK;
}

Status Pop2(SqStack2 &S,SElemType2 &e)
{
// 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR
	if(S.top==S.base) return ERROR;
     e=*--S.top;
	 return OK;
}

Status GetTop1(SqStack1 S)
{
// 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR
    int e;
	if(S.top==S.base) return ERROR;
    e=*(S.top-1);
	return e;
}

Status GetTop2(SqStack2 S)
{
// 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR
    int e;
	if(S.top==S.base) return ERROR;
    e=*(S.top-1);
	return e;
}

int Precede(char ch1,char ch2)
{
  switch(ch2)
  {
      case '+':
      case '-':
          switch(ch1)
          {
          case '+':
          case '-':
          case '*':
          case '/':
          case ')':
            return OK;break;
          case '(':
          case '#':
            return ERROR;break;
          }
      case '*':
      case '/':
        switch(ch1)
        {
          case '+':
          case '-':
          case '(':
          case '#':return ERROR;break;
          case '*':
          case '/':
          case ')':return OK;
        }
      case '(':
        switch(ch1)
             {
          case '+':
          case '-':
          case '(':
          case '*':printf("50\n");
          case '/':
          case '#':return ERROR;break;
          case ')':return ERROR1;
             }
      case ')':
          switch(ch1)
            {
          case '+':
          case '-':
          case '*':
          case '/':
          case ')':return OK;printf("40\n"); break;
          case '(':return ERROR2;printf("30\n"); break;
          case '#':return ERROR1;
            }
     case '#':
           switch(ch1)
           {
          case '+':
          case '-':
          case '*':
          case '/':
          case ')':return OK;break;
          case '(':return ERROR1;break;
          case '#':return ERROR2;
           }
     }
     return OK;
}
int In(char ch)
{
    if(ch>='0'&&ch<='9') return 0;
    else return 1;
}
int Operate(int a,char ch,int b)
{
    switch(ch)
    {
        case '+':return a+b;break;
        case '-':return a-b;break;
        case '*':return a*b;break;
        case '/':return a/b;break;
    }
    return OK;
}
int main()
{
    char ch,CH,X;
    int a,b;
    struct SqStack2 OPND;
    struct SqStack1 OPTR;
    InitStack2(OPND);
    InitStack1(OPTR);
    Push1(OPTR,'#');
    scanf("%c",&ch);
    while(ch!='#'||GetTop1(OPTR)!='#')
    {
        if(!In(ch))
        {
            Push2(OPND,ch-48);
            scanf("%c",&ch);
            printf("100\n");
        }
        else
            switch(Precede(GetTop1(OPTR),ch))
            {
            case 1:
              Pop1(OPTR,CH);
              Pop2(OPND,b);
              Pop2(OPND,a);
              Push2(OPND,Operate(a,CH,b));
              break;
            case 0:
                Push1(OPTR,ch);
                scanf("%c",&ch);
                break;
            case 2:
                printf("20\n");
                Pop1(OPTR,X);
                scanf("%c",&ch);
                break;
            }
    }
    printf("%d",GetTop2(OPND));
    return 0;
}
